package org.example.config;

import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 拦截器解析token
 */
@Slf4j
@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String url = request.getRequestURL().toString();
        String token = request.getHeader("token");

// 如果是 OPTIONS 请求当客户端尝试对一个与当前源不同的服务器发起跨域 HTTP 请求时
// ，如果该请求包含复杂的 HTTP 方法（比如 PUT、DELETE）或使用了一些特殊的请求头
// （如 Authorization），浏览器会自动先发出 OPTIONS
// 请求，检查服务器是否允许该请求。这个过程称为预检请求 (Preflight Request)。
// 通过预检，浏览器可以在发送实际的 HTTP 请求之前，确保服务器接受该请求，避免不必要的数据传输。
//————————————————
//

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "86400");
        response.setHeader("Access-Control-Allow-Headers", "*");
        // 如果是OPTIONS则结束请求
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            response.setStatus(HttpStatus.NO_CONTENT.value());
            return false;
        }


        if(token==null || token==""){
            response.setStatus(401);//设置状态码401，要求前端跳转登录页面
            log.error("Myhandler:token is Empty");
            //拦截成功
            return false;
        }
        else {
            try {
                Claims claims = JwtUtil.parseJWT(token);

                System.out.println("校验成功，解码后的数据: " + claims);
                String role = (String) claims.get("role");
                if(role.equals("vip"))
                {
                    //放行
                    return true;
                }
                
                if(role.equals("common"))
                {
                    if(request.getRequestURI().contains("/vip"))
                    {
                        response.setStatus(HttpStatus.FORBIDDEN.value()); //403
                        //11. 返回
                        return false;
                    }
                }
                return true;
            } catch (Exception e) {
                response.setStatus(401);//设置状态码401，要求前端跳转登录页面
                log.error("Myhandler:token is Error");
                e.printStackTrace();
                return false;
            }
        }

    }

}